package cn.kgc.util;

import cn.hutool.core.util.RandomUtil;
import cn.kgc.config.MinioConfig;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;

/**
 * @author YC
 */
@Component
public class FileManager {

    @Resource
    private MinioConfig minioConfig;

    /**
     * 创建MinioClient对象
     *
     * @return MinioClient对象
     */
    private MinioClient minioClient() {
        return MinioClient.builder()
                .credentials(minioConfig.getAccessKey(), minioConfig.getSecretKey())
                .endpoint(minioConfig.getEndpoint()).build();
    }

    /**
     * 上传文件接口
     *
     * @param multipartFile 文件
     * @param filePath      minio中的文件路径
     * @return 文件URL
     * @throws Exception 异常
     */
    public String uploadFile(MultipartFile multipartFile, String filePath) throws Exception {
        //创建client对象
        MinioClient minioClient = minioClient();
        // 防止重名的文件名
        String fileName = filePath + "/" + System.currentTimeMillis()
                + RandomUtil.randomString(5) + multipartFile.getOriginalFilename();
        //设置上传文件的相关信息
        PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                // 指定文件名
                .object(fileName)
                // 上传的文件类型
                .contentType(multipartFile.getContentType())
                // 使用输入流读取multipartFile文件的内容
                .stream(multipartFile.getInputStream(), multipartFile.getSize(), -1)
                // 存储桶名
                .bucket(minioConfig.getBucketName()).build();
        //上传文件
        minioClient.putObject(putObjectArgs);
        //返回文件的路径
        return minioConfig.getEndpoint() + "/" + minioConfig.getBucketName() + "/" + fileName;
    }

}
